{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "mounted-career",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[-1.06595, -2.74223],\n",
       "        [-0.87436, -1.91486],\n",
       "        [ 1.39905, -1.28352],\n",
       "        [ 0.18064, -2.87754],\n",
       "        [-0.22919, -1.86742]]),\n",
       " array([1, 1, 1, 1, 1]))"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "\n",
    "#加载数据\n",
    "def load_data():\n",
    "    #可分不可分都可以处理\n",
    "    with open('线性不可分数据集.txt') as fr:\n",
    "        lines = fr.readlines()\n",
    "\n",
    "    x = np.ones((len(lines), 2), dtype=float)\n",
    "    y = np.empty(len(lines), dtype=float)\n",
    "\n",
    "    for i in range(len(lines)):\n",
    "        line = lines[i].strip().split(',')\n",
    "        x[i] = line[:2]\n",
    "        y[i] = line[2]\n",
    "\n",
    "    y = y.astype(np.int)\n",
    "\n",
    "    return x, y\n",
    "\n",
    "\n",
    "x, y = load_data()\n",
    "x[:5], y[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "closed-northeast",
   "metadata": {},
   "outputs": [],
   "source": [
    "#常量\n",
    "N, M = x.shape\n",
    "\n",
    "w = np.empty(M)\n",
    "w.fill(1 / M)\n",
    "b = 0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "crazy-mechanics",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "#把线画出来,线就是wx + b = 0\n",
    "def draw():\n",
    "    X = np.arange(x[:, 0].min(), x[:, 0].max(), 1)\n",
    "    Y = np.empty([len(X)])\n",
    "\n",
    "    for i in range(len(X)):\n",
    "        Y[i] = (-w[0] * X[i] - b) / w[1]\n",
    "    plt.plot(X, Y, c='red')\n",
    "\n",
    "    for i in range(len(X)):\n",
    "        Y[i] = (1 - w[0] * X[i] - b) / w[1]\n",
    "    plt.plot(X, Y, c='blue')\n",
    "\n",
    "    for i in range(len(X)):\n",
    "        Y[i] = (-1 - w[0] * X[i] - b) / w[1]\n",
    "    plt.plot(X, Y, c='green')\n",
    "\n",
    "    plt.scatter(x[:, 0], x[:, 1], c=y)\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "draw()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "clear-locking",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.90409"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def predict(x):\n",
    "    return w.dot(x) + b\n",
    "\n",
    "\n",
    "predict(x[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "strategic-maldives",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-1.90409, -2.6927899019789865)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#函数距离,缺点是w和b同时成比例变化时,它也会变化\n",
    "def functional_margin(x, y):\n",
    "    return y * w.dot(x) + b\n",
    "\n",
    "\n",
    "#几何距离,w和b成比例变化时,对它没有影响\n",
    "def geometric_marginn(x, y):\n",
    "    l2_w = (w**2).sum()**0.5\n",
    "    return functional_margin(x, y) / l2_w\n",
    "\n",
    "\n",
    "functional_margin(x[0], y[0]), geometric_marginn(x[0], y[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "reserved-shoulder",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.023865000000000025, 0.03375020666603395)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#最小函数距离\n",
    "def min_functional_margin():\n",
    "    _min = np.inf\n",
    "    for i in range(N):\n",
    "        temp = functional_margin(x[i], y[i])\n",
    "        if temp < 0:\n",
    "            continue\n",
    "        if temp < _min:\n",
    "            _min = temp\n",
    "    return _min\n",
    "\n",
    "\n",
    "#最小几何距离\n",
    "def min_geometric_marginn():\n",
    "    l2_w = (w**2).sum()**0.5\n",
    "    return min_functional_margin() / l2_w\n",
    "\n",
    "\n",
    "min_functional_margin(), min_geometric_marginn()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "neutral-submission",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "186.34919000000005"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#现在的问题就是要max 最小几何距离 对每一个xy满足 几何距离 >= 最小几何距离\n",
    "#写成函数就是 max min_geometric_marginn st. geometric_marginn(x,y) >= min_geometric_marginn\n",
    "\n",
    "#试一下用梯度下降的方法来找到这个解\n",
    "\n",
    "#合页损失函数\n",
    "def get_loss():\n",
    "    #loss分两部分,第1部分是w越大loss越大,第2部分是预测错误的loss\n",
    "    lam = 0.2  #平衡两部分loss的变量\n",
    "    l2_w = (w**2).sum()  #w越大loss越大\n",
    "\n",
    "    loss = 0\n",
    "    for i in range(N):\n",
    "        pred = y[i] * (w.dot(x[i]) + b)\n",
    "        pred = 1 - pred  #如果分类正确,那至少要正确到1以上,即使计算结果是0.9,也认为是错误\n",
    "        relu = pred if pred > 0 else 0  #本来正数是预测正确,上面因为用1减了,所以变号了,现在是负数才是预测正确\n",
    "        loss += relu\n",
    "    return loss + lam * l2_w\n",
    "\n",
    "\n",
    "get_loss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "hungarian-necessity",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([-12.05341801, 184.95180199]), -5.684341886080801e-09)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#我发明的暴力求梯度的方法.\n",
    "def get_gradient():\n",
    "    global w\n",
    "    global b\n",
    "\n",
    "    #这个变量就是增量了\n",
    "    upsilon = 1e-5\n",
    "\n",
    "    #先算出给增量前的loss\n",
    "    loss = get_loss()\n",
    "\n",
    "    #求w梯度\n",
    "    grad_w = np.empty(M)\n",
    "    for i in range(M):\n",
    "        w[i] += upsilon\n",
    "        loss2 = get_loss()\n",
    "        w[i] -= upsilon\n",
    "        grad_w[i] = (loss2 - loss) / upsilon\n",
    "\n",
    "    #求b梯度\n",
    "    b += upsilon\n",
    "    loss2 = get_loss()\n",
    "    b -= upsilon\n",
    "    grad_b = (loss2 - loss) / upsilon\n",
    "\n",
    "    return grad_w, grad_b\n",
    "\n",
    "\n",
    "get_gradient()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "compliant-specification",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 152.0036068893805\n",
      "200 9.183026404654\n",
      "400 8.929522873248773\n",
      "600 8.74566584792982\n",
      "800 8.594796294245398\n",
      "1000 8.580817045414612\n",
      "1200 8.568907394232566\n",
      "1400 8.559163671955792\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for epoch in range(1500):\n",
    "    grad_w, grad_b = get_gradient()\n",
    "    w -= grad_w * 1e-3\n",
    "    b -= grad_b * 1e-3\n",
    "\n",
    "    if epoch % 200 == 0:\n",
    "        print(epoch, get_loss())\n",
    "\n",
    "draw()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
